package com.tuling.jvm;

/**
 * Created by chenhs on 2018/8/6.
 * 在JDK1.6中，intern()方法会把首次遇到的字符串复制到永久代中，返回的也是永久代中这个字符串的引用，而由StringBuilder创建的字符串实例在Java堆中，所以必然不是同一个引用，将返回false。
 *
 * 而JDK1.7(以及部分其他虚拟机，例如JRockit)的intern()实现不会再复制实例，而是在常量池中记录首次出现的实例引用，因此intern()返回的引用和由StringBuilder创建的那个字符串是同一个。
 *
 * [jdk1.7] true, false != [jdk1.6] false, false
 */
public class RuntimeConstantPoolOOM2 {

    public static void main(String[] args) {



        String RuntimeConstantPoolOOM2 = "xyz";

        //首次出现，则同一个引用   true
        String str1 = new StringBuilder("计算机").append("软件").toString();
        System.out.println(str1.intern() == str1);

        //已经出现过，不是首次了   false
        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2.intern() == str2);

        //已经出现过，不是首次了   false
        String str3 = new StringBuilder("ma").append("in").toString();
        System.out.println(str3.intern() == str3);

        //已经出现过，不是首次了   false
        String str4 = new StringBuilder("xy").append("z").toString();
        System.out.println(str4.intern() == str4);

        //首次出现，则同一个引用   true
        String str5 = new StringBuilder("abc").append("dfg").toString();
        System.out.println(str5.intern() == str5);

    }

}
